home *** CD-ROM | disk | FTP | other *** search
/ Aminet 38 / Aminet 38 (2000)(Schatztruhe)[!][Aug 2000].iso / Aminet / misc / math / libalgo.lha / algomath / src / swapdig.c < prev   
Encoding:
C/C++ Source or Header  |  2000-05-30  |  1.6 KB  |  109 lines

  1. /* swap two digits d1 d2 of a number n*/
  2.  
  3. #include "defs.h"
  4.  
  5. int am_swap(int n, int d1, int d2)
  6. {
  7.  
  8.     int dig[]={0,0,0,0,0,0,0,0,0,0};
  9.     int t=n,x=0,j=0,i;
  10.  
  11.     if(n>999999999)
  12.         return n;
  13.     if(n<0){
  14.         n = -n;
  15.         t = n;
  16.         x=1;
  17.     }
  18.  
  19.     if(d1<0)
  20.         d1 = -d1;
  21.     if(d1>9){
  22.         for(i = 0; i < 9; i++)
  23.             while(d1 >= _am_asciiconv[i])
  24.                 d1 -= _am_asciiconv[i];
  25.         while(d1 >= _am_asciiconv[i])
  26.         {
  27.             d1 -= _am_asciiconv[i];
  28.             j++;
  29.         }
  30.         d1=j;
  31.         j=0;
  32.     }
  33.     if(d2<0)
  34.         d2 = -d2;
  35.     if(d2>9){
  36.         for(i = 0; i < 9; i++)
  37.             while(d2 >= _am_asciiconv[i])
  38.                 d2 -= _am_asciiconv[i];
  39.         while(d2 >= _am_asciiconv[i])
  40.         {
  41.             d2 -= _am_asciiconv[i];
  42.             j++;
  43.         }
  44.         d2=j;
  45.     }
  46.  
  47.     while(n >= _am_asciiconv[0])
  48.     {
  49.         n -= _am_asciiconv[0];
  50.         dig[9]++;
  51.     }
  52.  
  53.     while(n >= _am_asciiconv[1])
  54.     {
  55.         n -= _am_asciiconv[1];
  56.         dig[8]++;
  57.     }
  58.  
  59.  
  60.     while(n >= _am_asciiconv[2])
  61.     {
  62.         n -= _am_asciiconv[2];
  63.         dig[7]++;
  64.     }
  65.  
  66.     while(n >= _am_asciiconv[3])
  67.     {
  68.         n -= _am_asciiconv[3];
  69.         dig[6]++;
  70.     }
  71.  
  72.     while(n >= _am_asciiconv[4])
  73.     {
  74.         n -= _am_asciiconv[4];
  75.         dig[5]++;
  76.     }
  77.  
  78.     while(n >= _am_asciiconv[5])
  79.     {
  80.         n -= _am_asciiconv[5];
  81.         dig[4]++;
  82.     }
  83.  
  84.     while(n >= _am_asciiconv[6])
  85.     {
  86.         n -= _am_asciiconv[6];
  87.         dig[3]++;
  88.     }
  89.  
  90.     while(n >= _am_asciiconv[7])
  91.     {
  92.         n -= _am_asciiconv[7];
  93.         dig[2]++;
  94.     }
  95.  
  96.     while(n >= _am_asciiconv[8])
  97.     {
  98.         n -= _am_asciiconv[8];
  99.         dig[1]++;
  100.     }
  101.  
  102.     dig[0]= n;
  103.  
  104. if(x)
  105.     return -(t-dig[d1-1]*_am_asciiconv[10-d1]+dig[d2-1]*_am_asciiconv[10-d1]-dig[d2-1]*_am_asciiconv[10-d2]+dig[d1-1]*_am_asciiconv[10-d2]);
  106. else
  107.     return t-dig[d1-1]*_am_asciiconv[10-d1]+dig[d2-1]*_am_asciiconv[10-d1]-dig[d2-1]*_am_asciiconv[10-d2]+dig[d1-1]*_am_asciiconv[10-d2];
  108.  
  109. }